const CONTENT_PATH = './content/';
const IMAGE_PATH = '/content';

window.addEventListener('hashchange', onHashChange);
window.addEventListener('load', onLoad);

function getHash() {

    let url = new URL(window.location.href);
    return url.hash.startsWith('#', 0) ? url.hash.substring(1) : url.hash;

}

function getFileName() {

    // TODO добавить парсинг разделов внутри документа
    let hash = getHash();
    if (hash == '') hash = 'index';
    return CONTENT_PATH + hash + '.md';

}

async function onHashChange() {

    await loadContent();

}

async function onLoad() {

    await loadContent();

}

async function loadContent() {

    return fetch(getFileName())
        .then(response => getResponse(response))
        .then(text => {

            let converter = new showdown.Converter();
            content().innerHTML = converter.makeHtml(text);

        })
        .then(postProcessing)
        .catch(error => {

            console.error(error);

            if (error == '404') show404();

        });

}

function postProcessing() {

    postProcessingLinks();
    postProcessingImages();

}

function postProcessingLinks() {

    // TODO а не перенести ли обработку ссылок в preProcessing?
    let links = content().getElementsByTagName('a');

    for (let a of links) {

        let url = new URL(a.href);

        if ((url.hostname === window.location.hostname) && (url.pathname.endsWith('.md'))) {

            // TODO учесть, что в линке может быть вложенная директория
            // TODO учесть, что в линке может быть раздел статьи
            a.href = url.origin + '#' + url.pathname.substring(1, url.pathname.indexOf('.md'));

        }

    }

}

function postProcessingImages() {

    let images = content().getElementsByTagName('img');

    for (let img of images) {

        let url = new URL(img.src);

        if (url.hostname === window.location.hostname) {

            img.src = url.origin + IMAGE_PATH + url.pathname;

        }

    }

}

async function getResponse(response) {

    if (response.ok) return response.text();

    if (response.status === 404) return Promise.reject('404');

    return Promise.reject(`error, status = ${response.status}`);

}

function content() {

    return document.getElementById('content');

}

function show404() {

    content().innerHTML = `<p class='error'>Файл ${getFileName()} не найден, запрос вернул статус 404.</p>`;

}